package com.literaryfamily.literaryfamily.service;

import com.literaryfamily.literaryfamily.exceptions.UserException;
import com.literaryfamily.literaryfamily.model.ReturnResult;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 所有涉及读写的方法都需要抛出 WriteError 数据库读写错误异常(这个是运行时异常,只需要抛出不需要处理)
 * 此接口所有方法均不检查用户身份,应该验证身份后在进行检查
 *
 * @author 滑稽/因果报应
 */
public interface FileService {
    /**
     * 上传文件（支持多种文件类型）。
     *
     * @param file     上传的文件
     * @param fileType 文件类型 支持:"图片,允许的类型:jpeg,png(范围50KB-10MB),压缩包,允许的类型:lz,lz4,rar,zip,7z,视频文件(1MB-1GB),允许的类型:mp4
     * @param fileName 指定的文件名称
     * @param fileUrl  文件路径(可选,为null时使用默认路径)
     * @return 返回文件存储路径或 URL
     * @throws IOException 文件读写错误
     */
    List<String> uploadFile(MultipartFile file, String fileType, String fileName, @Nullable String fileUrl) throws IOException;

    /**
     * 生成下载链接
     *
     * @param fileName 目标文件名称
     * @param fileUrl  开始寻找的文件路径(可选,为null时使用默认路径)
     * @return 下载连接
     * @throws IOException 读写错误
     */
    ResponseEntity<InputStreamResource> downloadFile(String fileName, @Nullable String fileUrl) throws IOException;

    /**
     * 删除某个文件
     *
     * @param fileName 被删除的文件的文件名
     * @param fileUrl  文件路径(可选,为null时使用默认路径)
     * @return 操作结果
     */
    String deleteFile(String fileName, @Nullable String fileUrl) throws IOException;
}